library(tidyverse)
library(sf)
library(rnaturalearth)
library(rnaturalearthdata)

geom_map

map_data(map, region = ".", exact = FALSE, ...)
map_data('world') %>% as_tibble()
world0 <- map_data('world')
world0 %>%
  ggplot() +
  geom_map(aes(long, lat, map_id = region), map = world0, fill = "gray", col = "black", size = 0.1) 
Warning: Ignoring unknown aesthetics: x and y

library(maps)
iso.expand("JP")
[1] "Japan"
iso3166
library(WDI)
wdi_cache <- WDIcache()
wdi_cache
$series

$country
NA
world0 <- map_data('world')
wdi_income <- wdi_cache$country %>% select(iso2c, income)
world_income <- world0 %>% mutate(iso2c = iso.alpha(region, n=2)) %>%
  left_join(wdi_income, by = "iso2c") 
world_income
world_income %>% 
  mutate(income_level = factor(income, levels = c("High income", "Upper middle income", "Lower middle income", "Low income", "Not classified", NA))) %>%
  ggplot() +
  geom_map(aes(long, lat, map_id = region, fill = income_level), map = world_income, col = "black", size = 0.1) 
Warning: Ignoring unknown aesthetics: x and y

world0 %>% left_join(iso3166, by = c("region" = "mapname")) 
wdi_cache$country
eastasia <- map_data('world', region = c("Japan", "South Korea", "North Korea", "China", "Mongolia", "Taiwan")) %>%
  mutate(iso2c = iso.alpha(region, n=2))
eastasia %>%
  ggplot() +
  geom_map(aes(long, lat, map_id = region), map = eastasia, fill = "gray", col = "black", size = 0.1) 
Warning: Ignoring unknown aesthetics: x and y

eastasia <- map_data('world', region = c("Japan", "South Korea", "North Korea", "China", "Mongolia", "Taiwan")) %>% mutate(iso2c = iso.alpha(region, n=2))
eastasia %>% left_join(wdi_income, by = "iso2c") %>% 
  mutate(income_level = factor(income, levels = c("High income", "Upper middle income", "Lower middle income", "Low income", "Not classified", NA))) %>%
  ggplot() +
  geom_map(aes(long, lat, map_id = region, fill = income_level), map = eastasia, col = "black", size = 0.1) 
Warning: Ignoring unknown aesthetics: x and y

china <- map_data('world', region = c("China"))
china %>%
  ggplot() +
  geom_map(aes(long, lat, map_id = region, fill = subregion), map = china, col = "black", size = 0.1) 
Warning: Ignoring unknown aesthetics: x and y

ea <- map_data('world', region = c("Japan", "South Korea", "North Korea", "China", "Mongolia", "Taiwan"))
ea %>%
  ggplot() +
  geom_map(aes(long, lat, map_id = region, fill = region), map = ea, col = "black", size = 0.1) +
  labs(x = "", y = "") + 
  theme(legend.position="none", panel.grid = element_blank(), 
        axis.text.x=element_blank(), axis.ticks.x=element_blank(),
        axis.text.y=element_blank(), axis.ticks.y=element_blank())
Warning: Ignoring unknown aesthetics: x and y

map_data('world') %>% ggplot(aes(long, lat)) + geom_polygon(aes(group = group, fill = region), col = "black", linewidth = 0.1) + theme(legend.position="none")

map_data('world2') %>% ggplot(aes(long, lat)) + geom_polygon(aes(group = group, fill = region), col = "black", linewidth = 0.1) + theme(legend.position="none")

world1 <- sf::st_as_sf(map('world', plot = FALSE, fill = TRUE))
ggplot() + geom_sf(data = world1)

world_sf <- sf::st_as_sf(map('world', plot = FALSE, fill = TRUE)) %>% 
  mutate(iso2c = iso.alpha(ID, n=2)) %>% 
  left_join(wdi_income, by = "iso2c") 
world_sf %>% as_tibble()
world_sf %>% 
  mutate(income_level = factor(income, levels = c("High income", "Upper middle income", "Lower middle income", "Low income", "Not classified", NA))) %>%
  ggplot() +
  geom_sf(aes(fill = income_level)) 

world2 <- sf::st_transform(
  world1,
  "+proj=laea +y_0=0 +lon_0=155 +lat_0=-90 +ellps=WGS84 +no_defs"
)
ggplot() + geom_sf(data = world2)

Volcano Data

https://datavizpyr.com/how-to-make-world-map-with-ggplot2-in-r/

volcano <- readr::read_csv("https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-05-12/volcano.csv")
Rows: 958 Columns: 26── Column specification ───────────────────────────────────────────────────
Delimiter: ","
chr (18): volcano_name, primary_volcano_type, last_eruption_year, count...
dbl  (8): volcano_number, latitude, longitude, elevation, population_wi...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
volcano
ggplot() +
  geom_map(
    data = world0, map = world0,
    aes(long, lat, map_id = region),
    color = "white", fill = "lightgray", size = 0.1
  ) +
  geom_point(
    data = volcano,
    aes(longitude, latitude, color = primary_volcano_type),
    alpha = 0.7
  ) 
Warning: Ignoring unknown aesthetics: x and y

annotation_map

df <- data.frame(
  name = c("Charlotte", "Raleigh", "Greensboro"),
  lat = c(35.227, 35.772, 36.073),
  long = c(-80.843, -78.639, -79.792)
)

p <- ggplot(df, aes(x = long, y = lat)) +
  annotation_map(
    map_data("state"),
    fill = "antiquewhite", colour = "darkgrey"
  ) +
  geom_point(color = "blue") +
  geom_text(
    aes(label = name),
    hjust = 1.105, vjust = 1.05, color = "blue"
  )

p + xlim(-84, -76) + ylim(34, 37.2)

p +
  coord_sf(
    crs = sf::st_crs(3347),
    default_crs = sf::st_crs(4326),  # data is provided as long-lat
    xlim = c(-84, -76),
    ylim = c(34, 37.2)
  )

nc <- sf::st_read(system.file("shape/nc.shp", package = "sf"), quiet = TRUE)
p +
  geom_sf(
    data = nc, inherit.aes = FALSE,
    fill = NA, color = "black", linewidth = 0.1
  ) +
  coord_sf(crs = sf::st_crs(3347), default_crs = sf::st_crs(4326))

geom_sf

See also, coord_sf, geom_sf_label, geom_sf_text, stat_sf.

This set of geom, stat, and coord are used to visualise simple feature (sf) objects. For simple plots, you will only need geom_sf() as it uses stat_sf() and adds coord_sf() for you. geom_sf() is an unusual geom because it will draw different geometric objects depending on what simple features are present in the data: you can get points, lines, or polygons. For text and labels, you can use geom_sf_text() and geom_sf_label().

geom_sf(
  mapping = aes(),
  data = NULL,
  stat = "sf",
  position = "identity",
  na.rm = FALSE,
  show.legend = NA,
  inherit.aes = TRUE,
  ...
)
# map_data {ggplot2}
# Easily turn data from the maps package into a data frame suitable for plotting with ggplot2.
world_map <- map_data("world")
library(maps)
world1 <- sf::st_as_sf(map('world', plot = FALSE, fill = TRUE))
ggplot() + geom_sf(data = world1)

world_map <- map('world', plot = FALSE)
glimpse(world_map)
List of 4
 $ x    : num [1:82403] -69.9 -69.9 -69.9 -70 -70.1 ...
 $ y    : num [1:82403] 12.5 12.4 12.4 12.5 12.5 ...
 $ range: num [1:4] -180 190.3 -85.2 83.6
 $ names: chr [1:1627] "Aruba" "Afghanistan" "Angola" "Angola:Cabinda" ...
 - attr(*, "class")= chr "map"

geom_polygon

# When using geom_polygon, you will typically need two data frames:
# one contains the coordinates of each polygon (positions),  and the
# other the values associated with each polygon (values).  An id
# variable links the two together

ids <- factor(c("1.1", "2.1", "1.2", "2.2", "1.3", "2.3"))

values <- data.frame(
  id = ids,
  value = c(3, 3.1, 3.1, 3.2, 3.15, 3.5)
)

positions <- data.frame(
  id = rep(ids, each = 4),
  x = c(2, 1, 1.1, 2.2, 1, 0, 0.3, 1.1, 2.2, 1.1, 1.2, 2.5, 1.1, 0.3,
  0.5, 1.2, 2.5, 1.2, 1.3, 2.7, 1.2, 0.5, 0.6, 1.3),
  y = c(-0.5, 0, 1, 0.5, 0, 0.5, 1.5, 1, 0.5, 1, 2.1, 1.7, 1, 1.5,
  2.2, 2.1, 1.7, 2.1, 3.2, 2.8, 2.1, 2.2, 3.3, 3.2)
)

# Currently we need to manually merge the two together
datapoly <- merge(values, positions, by = c("id"))

p <- ggplot(datapoly, aes(x = x, y = y)) +
  geom_polygon(aes(fill = value, group = id))
p

# Which seems like a lot of work, but then it's easy to add on
# other features in this coordinate system, e.g.:

set.seed(1)
stream <- data.frame(
  x = cumsum(runif(50, max = 0.1)),
  y = cumsum(runif(50,max = 0.1))
)

p + geom_line(data = stream, colour = "grey30", linewidth = 5)

# And if the positions are in longitude and latitude, you can use
# coord_map to produce different map projections.

  # As of R version 3.6 geom_polygon() supports polygons with holes
  # Use the subgroup aesthetic to differentiate holes from the main polygon

  holes <- do.call(rbind, lapply(split(datapoly, datapoly$id), function(df) {
    df$x <- df$x + 0.5 * (mean(df$x) - df$x)
    df$y <- df$y + 0.5 * (mean(df$y) - df$y)
    df
  }))
  datapoly$subid <- 1L
  holes$subid <- 2L
  datapoly <- rbind(datapoly, holes)

  p <- ggplot(datapoly, aes(x = x, y = y)) +
    geom_polygon(aes(fill = value, group = id, subgroup = subid))
  p

Natural Earth Data

https://www.naturalearthdata.com

Get natural earth world country polygons

Manual: https://cran.r-project.org/web/packages/rnaturalearth/rnaturalearth.pdf

ne_countries

ne_countries(
  scale = 110,
  type = "countries",
  continent = NULL,
  country = NULL,
  geounit = NULL,
  sovereignty = NULL,
  returnclass = c("sp", "sf")
)

Arguments

  • scale: scale of map to return, one of 110, 50, 10 or ‘small’, ‘medium’, ‘large’
  • type: country type, one of ‘countries’, ‘map_units’, ‘sovereignty’, ‘tiny_countries’
  • continent: a character vector of continent names to get countries from.
  • country: a character vector of country names.
  • geounit: a character vector of geounit names.
  • sovereignty: a character vector of sovereignty names.
  • returnclass: ‘sp’ default or ‘sf’ for Simple Features
ne_countries(scale = "large", returnclass = "sf") %>%
  ggplot() +   geom_sf()

ne_countries(scale = "small", returnclass = "sf") %>%
  ggplot() +   geom_sf()

world <- ne_countries(scale = "medium", returnclass = "sf")
class(world)
[1] "sf"         "data.frame"
world %>% as_tibble()
world %>% colnames()
 [1] "scalerank"  "featurecla" "labelrank"  "sovereignt" "sov_a3"    
 [6] "adm0_dif"   "level"      "type"       "admin"      "adm0_a3"   
[11] "geou_dif"   "geounit"    "gu_a3"      "su_dif"     "subunit"   
[16] "su_a3"      "brk_diff"   "name"       "name_long"  "brk_a3"    
[21] "brk_name"   "brk_group"  "abbrev"     "postal"     "formal_en" 
[26] "formal_fr"  "note_adm0"  "note_brk"   "name_sort"  "name_alt"  
[31] "mapcolor7"  "mapcolor8"  "mapcolor9"  "mapcolor13" "pop_est"   
[36] "gdp_md_est" "pop_year"   "lastcensus" "gdp_year"   "economy"   
[41] "income_grp" "wikipedia"  "fips_10"    "iso_a2"     "iso_a3"    
[46] "iso_n3"     "un_a3"      "wb_a2"      "wb_a3"      "woe_id"    
[51] "adm0_a3_is" "adm0_a3_us" "adm0_a3_un" "adm0_a3_wb" "continent" 
[56] "region_un"  "subregion"  "region_wb"  "name_len"   "long_len"  
[61] "abbrev_len" "tiny"       "homepart"   "geometry"  
world %>% ggplot() +   geom_sf()

world %>% ggplot() +   geom_sf(aes(fill = income_grp))

world %>% filter(subregion == "South-Eastern Asia") %>%
  ggplot() +   geom_sf(aes(fill = income_grp))

type argument

ne_countries(type = "countries", country = "Japan", scale = "medium", returnclass = "sf") %>%
  ggplot() + geom_sf()

ne_countries(type = "map_units", country = "Japan", scale = "medium", returnclass = "sf") %>%
  ggplot() + geom_sf()

library(sp)
  sf_world <- ne_countries(returnclass = "sf")
  plot(sf_world)
Warning: plotting the first 9 out of 94 attributes; use max.plot = 94 to plot all

spdf_tiny_countries <- ne_countries(type = "tiny_countries", scale = 50)
  plot(spdf_tiny_countries)

ne_states

Get natural earth world state (admin level 1) polygons

Description: returns state polygons (administrative level 1) for specified countries

Usage

ne_states(
  country = NULL,
  geounit = NULL,
  iso_a2 = NULL,
  spdf = NULL,
  returnclass = c("sp", "sf")
)

Arguments

  • country: a character vector of country names.

  • geounit: a character vector of geounit names.

  • iso_a2: a character vector of iso_a2 country codes

  • spdf: an optional alternative states map

  • returnclass: ‘sp’ default or ‘sf’ for Simple Features

Value

  • SpatialPolygons DataFrame or sf
world_admin1 <- ne_states(returnclass = "sf")
class(world_admin1)
[1] "sf"         "data.frame"
world_admin1 %>% colnames()
  [1] "featurecla" "scalerank"  "adm1_code"  "diss_me"    "iso_3166_2"
  [6] "wikipedia"  "iso_a2"     "adm0_sr"    "name"       "name_alt"  
 [11] "name_local" "type"       "type_en"    "code_local" "code_hasc" 
 [16] "note"       "hasc_maybe" "region"     "region_cod" "provnum_ne"
 [21] "gadm_level" "check_me"   "datarank"   "abbrev"     "postal"    
 [26] "area_sqkm"  "sameascity" "labelrank"  "name_len"   "mapcolor9" 
 [31] "mapcolor13" "fips"       "fips_alt"   "woe_id"     "woe_label" 
 [36] "woe_name"   "latitude"   "longitude"  "sov_a3"     "adm0_a3"   
 [41] "adm0_label" "admin"      "geonunit"   "gu_a3"      "gn_id"     
 [46] "gn_name"    "gns_id"     "gns_name"   "gn_level"   "gn_region" 
 [51] "gn_a1_code" "region_sub" "sub_code"   "gns_level"  "gns_lang"  
 [56] "gns_adm1"   "gns_region" "min_label"  "max_label"  "min_zoom"  
 [61] "wikidataid" "name_ar"    "name_bn"    "name_de"    "name_en"   
 [66] "name_es"    "name_fr"    "name_el"    "name_hi"    "name_hu"   
 [71] "name_id"    "name_it"    "name_ja"    "name_ko"    "name_nl"   
 [76] "name_pl"    "name_pt"    "name_ru"    "name_sv"    "name_tr"   
 [81] "name_vi"    "name_zh"    "ne_id"      "name_he"    "name_uk"   
 [86] "name_ur"    "name_fa"    "name_zht"   "FCLASS_ISO" "FCLASS_US" 
 [91] "FCLASS_FR"  "FCLASS_RU"  "FCLASS_ES"  "FCLASS_CN"  "FCLASS_TW" 
 [96] "FCLASS_IN"  "FCLASS_NP"  "FCLASS_PK"  "FCLASS_DE"  "FCLASS_GB" 
[101] "FCLASS_BR"  "FCLASS_IL"  "FCLASS_PS"  "FCLASS_SA"  "FCLASS_EG" 
[106] "FCLASS_MA"  "FCLASS_PT"  "FCLASS_AR"  "FCLASS_JP"  "FCLASS_KO" 
[111] "FCLASS_VN"  "FCLASS_TR"  "FCLASS_ID"  "FCLASS_PL"  "FCLASS_GR" 
[116] "FCLASS_IT"  "FCLASS_NL"  "FCLASS_SE"  "FCLASS_BD"  "FCLASS_UA" 
[121] "FCLASS_TLC" "geometry"  
world_admin1 |> as_tibble()
world_admin1 |> glimpse()
Rows: 4,596
Columns: 122
$ featurecla <chr> "Admin-1 states provinces lakes", "Admin-1 states prov…
$ scalerank  <int> 3, 6, 2, 6, 3, 4, 4, 3, 4, 3, 4, 3, 3, 10, 9, 2, 2, 2,…
$ adm1_code  <chr> "ARG-1309", "URY-8", "IDN-1185", "MYS-1186", "CHL-2694…
$ diss_me    <int> 1309, 8, 1185, 1186, 2694, 1936, 1937, 2693, 1939, 269…
$ iso_3166_2 <chr> "AR-E", "UY-PA", "ID-KI", "MY-12", "CL-AP", "BO-L", "B…
$ wikipedia  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ iso_a2     <chr> "AR", "UY", "ID", "MY", "CL", "BO", "BO", "CL", "BO", …
$ adm0_sr    <int> 1, 1, 5, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, …
$ name       <chr> "Entre Ríos", "Paysandú", "Kalimantan Timur", "Sabah",…
$ name_alt   <chr> "Entre-Rios", NA, "Kaltim", "North Borneo", NA, NA, NA…
$ name_local <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ type       <chr> "Provincia", "Departamento", "Propinsi", "State", "Reg…
$ type_en    <chr> "Province", "Department", "Province", "State", "Region…
$ code_local <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ code_hasc  <chr> "AR.ER", "UY.PA", "ID.KI", "MY.SA", "CL.AP", "BO.LP", …
$ note       <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ hasc_maybe <chr> NA, NA, NA, NA, NA, NA, NA, NA, "BO.OR|BOL-POT", NA, "…
$ region     <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ region_cod <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ provnum_ne <int> 10, 19, 15, 1, 0, 8, 7, 0, 1, 20006, 8, 22, 5, 0, 0, N…
$ gadm_level <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, …
$ check_me   <int> 20, 0, 20, 20, 20, 0, 0, 20, 10, 20, 10, 20, 20, 20, 2…
$ datarank   <int> 3, 8, 1, 6, 3, 8, 6, 3, 6, 3, 5, 3, 3, 10, 8, 1, 1, 1,…
$ abbrev     <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ postal     <chr> "ER", "PA", "KI", "SA", NA, "LP", "OR", "TA", "PO", "A…
$ area_sqkm  <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NA, 0, 0,…
$ sameascity <int> -99, -99, -99, -99, 7, 6, 6, -99, -99, 6, 7, 6, -99, -…
$ labelrank  <int> 3, 6, 2, 6, 7, 6, 6, 3, 4, 6, 7, 6, 3, 20, 9, 2, 2, 2,…
$ name_len   <int> 10, 8, 16, 5, 18, 6, 5, 8, 6, 11, 5, 5, 5, 8, 7, 6, 8,…
$ mapcolor9  <int> 3, 2, 6, 3, 5, 2, 2, 5, 2, 5, 4, 3, 3, 6, 3, 2, 4, 4, …
$ mapcolor13 <int> 13, 10, 11, 6, 9, 3, 3, 9, 3, 9, 11, 13, 13, 3, 7, 2, …
$ fips       <chr> "AR08", "UY11", "ID14", "MY16", NA, "BL04", "BL05", "C…
$ fips_alt   <chr> NA, NA, NA, NA, NA, NA, NA, NA, "BL05", NA, "PE18", NA…
$ woe_id     <int> 2344682, 2347650, 2345723, 2346310, 56043702, 2344804,…
$ woe_label  <chr> "Entre Rios, AR, Argentina", "Paysandú, UY, Uruguay",…
$ woe_name   <chr> "Entre Ríos", "Paysandú", "Kalimantan Timur", "Sabah",…
$ latitude   <dbl> -32.02750, -32.09330, 1.28915, 5.31115, -18.32070, -14…
$ longitude  <dbl> -59.28240, -57.22400, 116.35400, 117.09500, -69.68040,…
$ sov_a3     <chr> "ARG", "URY", "IDN", "MYS", "CHL", "BOL", "BOL", "CHL"…
$ adm0_a3    <chr> "ARG", "URY", "IDN", "MYS", "CHL", "BOL", "BOL", "CHL"…
$ adm0_label <int> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, …
$ admin      <chr> "Argentina", "Uruguay", "Indonesia", "Malaysia", "Chil…
$ geonunit   <chr> "Argentina", "Uruguay", "Indonesia", "Malaysia", "Chil…
$ gu_a3      <chr> "ARG", "URY", "IDN", "MYS", "CHL", "BOL", "BOL", "CHL"…
$ gn_id      <int> 3434137, 3441242, 1641897, 1733039, 6693562, 3911924, …
$ gn_name    <chr> "Provincia de Entre Rios", "Departamento de Paysandu",…
$ gns_id     <int> -988655, -908097, -2680740, -2405166, 10749159, -69341…
$ gns_name   <chr> "Entre Rios", "Paysandu, Departamento de", "Kalimantan…
$ gn_level   <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, NA, 1, 1,…
$ gn_region  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ gn_a1_code <chr> "AR.08", "UY.11", "ID.14", "MY.16", "CL.16", "BO.04", …
$ region_sub <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ sub_code   <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ gns_level  <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, NA, 1, 1,…
$ gns_lang   <chr> "khm", "fra", "ind", "fil", "ara", "kor", "kor", "fra"…
$ gns_adm1   <chr> "AR08", "UY11", "ID14", "MY16", "CI16", "BL04", "BL05"…
$ gns_region <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ min_label  <dbl> 6.0, 8.0, 5.0, 7.0, 6.0, 6.6, 6.6, 6.0, 6.6, 6.0, 6.6,…
$ max_label  <dbl> 11.0, 11.0, 10.1, 11.0, 11.0, 11.0, 11.0, 11.0, 11.0, …
$ min_zoom   <dbl> 6.0, 8.0, 4.6, 7.0, 6.0, 6.6, 6.6, 6.0, 6.6, 6.0, 6.6,…
$ wikidataid <chr> "Q44762", "Q16576", "Q3899", "Q179029", "Q2109", "Q272…
$ name_ar    <chr> "إنتري ريوس", "إدارة بايساندو", "كالمنتان الشرقية", "ص…
$ name_bn    <chr> "এন্ত্রে রিও প্রদেশ", "পেসান্ডো বিভাগ", "পূর্ব কালিমান্তান", …
$ name_de    <chr> "Entre Ríos", "Paysandú", "Ostkalimantan", "Sabah", "A…
$ name_en    <chr> "Entre Ríos", "Paysandú", "East Kalimantan", "Sabah", …
$ name_es    <chr> "Entre Ríos", "Paysandú", "Kalimantan Oriental", "Saba…
$ name_fr    <chr> "Entre Ríos", "Paysandú", "Kalimantan oriental", "Saba…
$ name_el    <chr> "Έντρε Ρίος", "Παϊσαντού", "Ανατολικό Καλιμαντάν", "Σα…
$ name_hi    <chr> "एन्ट्रे रियोस", "पयसंदु विभाग", "पूर्व कालिमंतान", "साबाह राज्…
$ name_hu    <chr> "Entre Ríos", "Paysandú", "Kelet-Kalimantan", "Sabah",…
$ name_id    <chr> "Entre Ríos", "Departemen Paysandú", "Kalimantan Timur…
$ name_it    <chr> "Entre Ríos", "dipartimento di Paysandú", "Kalimantan …
$ name_ja    <chr> "エントレ・リオス州", "パイサンドゥ県", "東カリマンタ…
$ name_ko    <chr> "엔트레리오스", "파이산두", "동칼리만탄", "사바", "아…
$ name_nl    <chr> "Entre Ríos", "Paysandú", "Oost-Kalimantan", "Sabah", …
$ name_pl    <chr> "Entre Ríos", "Paysandú", "Borneo Wschodnie", "Sabah",…
$ name_pt    <chr> "Entre Ríos", "Paysandú", "Kalimantan Oriental", "Sabá…
$ name_ru    <chr> "Энтре-Риос", "Пайсанду", "Восточный Калимантан", "Саб…
$ name_sv    <chr> "Entre Ríos", "Paysandú", "Kalimantan Timur", "Sabah",…
$ name_tr    <chr> "Entre Ríos eyaleti", "Paysandu Departmanı", "Doğu Kal…
$ name_vi    <chr> "Entre Ríos", "Paysandú", "Đông Kalimantan", "Sabah", …
$ name_zh    <chr> "恩特雷里奥斯省", "派桑杜省", "东加里曼丹省", "沙巴", …
$ ne_id      <dbl> 1159309789, 1159307733, 1159310009, 1159310033, 115931…
$ name_he    <chr> "אנטרה ריוס", "פאיסאנדו", "מזרח קלימנטאן", "סבה", "ארי…
$ name_uk    <chr> "Ентре-Ріос", "Пайсанду", "Східний Калімантан", "Сабах…
$ name_ur    <chr> "صوبہ انترے ریوس", "پایساندو محکمہ", "مشرقی کالیمانتان…
$ name_fa    <chr> "ایالت انتره ریوز", "بخش پایساندو", "کالیمانتان شرقی",…
$ name_zht   <chr> "恩特雷里奥斯省", "派桑杜省", "東加里曼丹省", "沙巴", …
$ FCLASS_ISO <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_US  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_FR  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_RU  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_ES  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_CN  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_TW  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_IN  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_NP  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_PK  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_DE  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_GB  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_BR  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_IL  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_PS  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_SA  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_EG  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_MA  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_PT  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_AR  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_JP  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_KO  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_VN  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_TR  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_ID  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_PL  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_GR  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_IT  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_NL  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_SE  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_BD  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_UA  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_TLC <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ geometry   <MULTIPOLYGON [°]> MULTIPOLYGON (((-58.20011 -..., MULTIPOLY…
world_admin1 %>% as_tibble() %>% 
  filter(iso_a2 != "-1") %>% arrange(admin) %>%
  distinct(iso_a2, admin)
world_admin1 %>% pull(FCLASS_JP) %>% unique()
[1] NA             "Unrecognized"
japan <- world_admin1[world_admin1$admin == "Japan",]
japan |> as_tibble()
ggplot() +   geom_sf(data = japan) +   theme_minimal()

country <- "Japan"
world_admin1 %>% filter(admin == country) %>% 
  ggplot() + geom_sf()

iso2 <- "ID"
world_admin1 %>% filter(iso_a2 == iso2) %>% 
  ggplot() +   geom_sf()

iso2s <- c("IN","PK","BD","LK")
world_admin1 %>% filter(iso_a2 %in% iso2s) %>% 
  ggplot() +   geom_sf(aes(fill = admin))

regions <- c("Tohoku")
world_admin1 %>% filter(region %in% regions) %>% 
  ggplot() +   geom_sf()

world_admin1 %>% filter(iso_a2 == "JP") %>%
  ggplot() +   geom_sf(aes(fill = region))

world_admin1 %>% filter(iso_a2 == "JP") %>%
  ggplot() +   geom_sf(aes(fill = name_local))

world_admin1 %>% filter(iso_a2 == "JP") %>%
  ggplot() +   geom_sf(aes(fill = name_local)) +
  theme(legend.position = "none")

world_admin1 %>% arrange(admin) %>% pull(admin) %>% unique()
  [1] "Afghanistan"                         
  [2] "Akrotiri Sovereign Base Area"        
  [3] "Aland"                               
  [4] "Albania"                             
  [5] "Algeria"                             
  [6] "American Samoa"                      
  [7] "Andorra"                             
  [8] "Angola"                              
  [9] "Anguilla"                            
 [10] "Antarctica"                          
 [11] "Antigua and Barbuda"                 
 [12] "Argentina"                           
 [13] "Armenia"                             
 [14] "Aruba"                               
 [15] "Ashmore and Cartier Islands"         
 [16] "Australia"                           
 [17] "Austria"                             
 [18] "Azerbaijan"                          
 [19] "Bahrain"                             
 [20] "Bangladesh"                          
 [21] "Barbados"                            
 [22] "Baykonur Cosmodrome"                 
 [23] "Belarus"                             
 [24] "Belgium"                             
 [25] "Belize"                              
 [26] "Benin"                               
 [27] "Bermuda"                             
 [28] "Bhutan"                              
 [29] "Bolivia"                             
 [30] "Bosnia and Herzegovina"              
 [31] "Botswana"                            
 [32] "Brazil"                              
 [33] "British Indian Ocean Territory"      
 [34] "British Virgin Islands"              
 [35] "Brunei"                              
 [36] "Bulgaria"                            
 [37] "Burkina Faso"                        
 [38] "Burundi"                             
 [39] "Cambodia"                            
 [40] "Cameroon"                            
 [41] "Canada"                              
 [42] "Cape Verde"                          
 [43] "Caribbean Netherlands"               
 [44] "Cayman Islands"                      
 [45] "Central African Republic"            
 [46] "Chad"                                
 [47] "Chile"                               
 [48] "China"                               
 [49] "Clipperton Island"                   
 [50] "Colombia"                            
 [51] "Comoros"                             
 [52] "Cook Islands"                        
 [53] "Coral Sea Islands"                   
 [54] "Costa Rica"                          
 [55] "Croatia"                             
 [56] "Cuba"                                
 [57] "Curaçao"                             
 [58] "Cyprus"                              
 [59] "Czech Republic"                      
 [60] "Democratic Republic of the Congo"    
 [61] "Denmark"                             
 [62] "Dhekelia Sovereign Base Area"        
 [63] "Djibouti"                            
 [64] "Dominica"                            
 [65] "Dominican Republic"                  
 [66] "East Timor"                          
 [67] "Ecuador"                             
 [68] "Egypt"                               
 [69] "El Salvador"                         
 [70] "Equatorial Guinea"                   
 [71] "Eritrea"                             
 [72] "Estonia"                             
 [73] "Ethiopia"                            
 [74] "Falkland Islands"                    
 [75] "Faroe Islands"                       
 [76] "Federated States of Micronesia"      
 [77] "Fiji"                                
 [78] "Finland"                             
 [79] "France"                              
 [80] "French Polynesia"                    
 [81] "French Southern and Antarctic Lands" 
 [82] "Gabon"                               
 [83] "Gambia"                              
 [84] "Gaza Strip"                          
 [85] "Georgia"                             
 [86] "Germany"                             
 [87] "Ghana"                               
 [88] "Gibraltar"                           
 [89] "Greece"                              
 [90] "Greenland"                           
 [91] "Grenada"                             
 [92] "Guam"                                
 [93] "Guatemala"                           
 [94] "Guernsey"                            
 [95] "Guinea"                              
 [96] "Guinea Bissau"                       
 [97] "Guyana"                              
 [98] "Haiti"                               
 [99] "Heard Island and McDonald Islands"   
[100] "Honduras"                            
[101] "Hong Kong S.A.R."                    
[102] "Hungary"                             
[103] "Iceland"                             
[104] "India"                               
[105] "Indian Ocean Territories"            
[106] "Indonesia"                           
[107] "Iran"                                
[108] "Iraq"                                
[109] "Ireland"                             
[110] "Isle of Man"                         
[111] "Israel"                              
[112] "Italy"                               
[113] "Ivory Coast"                         
[114] "Jamaica"                             
[115] "Japan"                               
[116] "Jersey"                              
[117] "Jordan"                              
[118] "Kazakhstan"                          
[119] "Kenya"                               
[120] "Kiribati"                            
[121] "Kosovo"                              
[122] "Kuwait"                              
[123] "Kyrgyzstan"                          
[124] "Laos"                                
[125] "Latvia"                              
[126] "Lebanon"                             
[127] "Lesotho"                             
[128] "Liberia"                             
[129] "Libya"                               
[130] "Liechtenstein"                       
[131] "Lithuania"                           
[132] "Luxembourg"                          
[133] "Macau S.A.R"                         
[134] "Macedonia"                           
[135] "Madagascar"                          
[136] "Malawi"                              
[137] "Malaysia"                            
[138] "Maldives"                            
[139] "Mali"                                
[140] "Malta"                               
[141] "Marshall Islands"                    
[142] "Mauritania"                          
[143] "Mauritius"                           
[144] "Mexico"                              
[145] "Moldova"                             
[146] "Monaco"                              
[147] "Mongolia"                            
[148] "Montenegro"                          
[149] "Montserrat"                          
[150] "Morocco"                             
[151] "Mozambique"                          
[152] "Myanmar"                             
[153] "Namibia"                             
[154] "Nauru"                               
[155] "Nepal"                               
[156] "Netherlands"                         
[157] "New Caledonia"                       
[158] "New Zealand"                         
[159] "Nicaragua"                           
[160] "Niger"                               
[161] "Nigeria"                             
[162] "Niue"                                
[163] "Norfolk Island"                      
[164] "North Korea"                         
[165] "Northern Cyprus"                     
[166] "Northern Mariana Islands"            
[167] "Norway"                              
[168] "Oman"                                
[169] "Pakistan"                            
[170] "Palau"                               
[171] "Panama"                              
[172] "Papua New Guinea"                    
[173] "Paraguay"                            
[174] "Peru"                                
[175] "Philippines"                         
[176] "Pitcairn Islands"                    
[177] "Poland"                              
[178] "Portugal"                            
[179] "Puerto Rico"                         
[180] "Qatar"                               
[181] "Republic of Serbia"                  
[182] "Republic of the Congo"               
[183] "Romania"                             
[184] "Russia"                              
[185] "Rwanda"                              
[186] "S. Sudan"                            
[187] "Saint Barthelemy"                    
[188] "Saint Helena"                        
[189] "Saint Kitts and Nevis"               
[190] "Saint Lucia"                         
[191] "Saint Martin"                        
[192] "Saint Pierre and Miquelon"           
[193] "Saint Vincent and the Grenadines"    
[194] "Samoa"                               
[195] "San Marino"                          
[196] "Sao Tome and Principe"               
[197] "Saudi Arabia"                        
[198] "Senegal"                             
[199] "Seychelles"                          
[200] "Siachen Glacier"                     
[201] "Sierra Leone"                        
[202] "Singapore"                           
[203] "Sint Maarten"                        
[204] "Slovakia"                            
[205] "Slovenia"                            
[206] "Solomon Islands"                     
[207] "Somalia"                             
[208] "Somaliland"                          
[209] "South Africa"                        
[210] "South Georgia and the Islands"       
[211] "South Korea"                         
[212] "Spain"                               
[213] "Spratly Is."                         
[214] "Sri Lanka"                           
[215] "Sudan"                               
[216] "Suriname"                            
[217] "Swaziland"                           
[218] "Sweden"                              
[219] "Switzerland"                         
[220] "Syria"                               
[221] "Taiwan"                              
[222] "Tajikistan"                          
[223] "Thailand"                            
[224] "The Bahamas"                         
[225] "Togo"                                
[226] "Tonga"                               
[227] "Trinidad and Tobago"                 
[228] "Tunisia"                             
[229] "Turkey"                              
[230] "Turkmenistan"                        
[231] "Turks and Caicos Islands"            
[232] "Tuvalu"                              
[233] "US Naval Base Guantanamo Bay"        
[234] "Uganda"                              
[235] "Ukraine"                             
[236] "United Arab Emirates"                
[237] "United Kingdom"                      
[238] "United Republic of Tanzania"         
[239] "United States Minor Outlying Islands"
[240] "United States Virgin Islands"        
[241] "United States of America"            
[242] "Uruguay"                             
[243] "Uzbekistan"                          
[244] "Vanuatu"                             
[245] "Vatican"                             
[246] "Venezuela"                           
[247] "Vietnam"                             
[248] "Wallis and Futuna"                   
[249] "West Bank"                           
[250] "Western Sahara"                      
[251] "Yemen"                               
[252] "Zambia"                              
[253] "Zimbabwe"                            

ne_download

download data from Natural Earth and (optionally) read into R

ne_download(scale = 110, type = "countries", returnclass = "sf") %>%
  ggplot() + geom_sf()
trying URL 'https://naturalearth.s3.amazonaws.com/110m_cultural/ne_110m_admin_0_countries.zip'
Content type 'application/zip' length 214976 bytes (209 KB)
==================================================
downloaded 209 KB

# for raster, here an example with Manual Shaded Relief (MSR) download & load

rst <- ne_download(scale = 50, type = "MSR_50M", category = "raster")
trying URL 'https://naturalearth.s3.amazonaws.com/50m_raster/MSR_50M.zip'
Content type 'application/zip' length 17984241 bytes (17.2 MB)
==================================================
downloaded 17.2 MB
# load after having downloaded
rst <- ne_load(
  scale = 50, type = "MSR_50M", category = "raster", destdir =
    getwd()
)

# plot
library(terra)
terra 1.7.29

Attaching package: ‘terra’

The following object is masked from ‘package:tidyr’:

    extract
terra::plot(rst)

# end dontrun

geodata

library(geodata)
tokyo_prefecture <- gadm("JPN", level = 2, path = "Tokyo")
tokyo <- st_as_sf(tokyo_prefecture)
tokyo %>% as_tibble()
tokyo %>% colnames()
 [1] "GID_2"     "GID_0"     "COUNTRY"   "GID_1"     "NAME_1"   
 [6] "NL_NAME_1" "NAME_2"    "VARNAME_2" "NL_NAME_2" "TYPE_2"   
[11] "ENGTYPE_2" "CC_2"      "HASC_2"    "geometry" 
tokyo %>% filter(NAME_1 == "Kanagawa") %>% 
  ggplot() + geom_sf(aes(fill = NAME_2)) + theme(legend.position = "none")

Miscellaneous

vietnam <- world_admin1 %>% filter(admin == "Vietnam")
glimpse(vietnam)
Rows: 63
Columns: 122
$ featurecla <chr> "Admin-1 states provinces lakes", "Admin-1 states prov…
$ scalerank  <int> 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, …
$ adm1_code  <chr> "VNM-486", "VNM-4835", "VNM-477", "VNM-478", "VNM-484"…
$ diss_me    <int> 486, 4835, 477, 478, 484, 444, 503, 500, 498, 502, 450…
$ iso_3166_2 <chr> "VN-28", "VN-72", "VN-33", "VN-30", "VN-58", "VN-37", …
$ wikipedia  <chr> NA, "http://en.wikipedia.org/wiki/%C4%90%E1%BA%AFk_N%C…
$ iso_a2     <chr> "VN", "VN", "VN", "VN", "VN", "VN", "VN", "VN", "VN", …
$ adm0_sr    <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
$ name       <chr> "Kon Tum", "Đắk Nông", "Đắk Lắk", "Gia Lai", "Bình Phư…
$ name_alt   <chr> NA, "Dak Nong", "Dak Lak|Dac Lac", "Gia Lai", "Binh Ph…
$ name_local <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ type       <chr> "Tỉnh", "Province", "Province", "Province", "Tỉnh", "T…
$ type_en    <chr> "Province", "Region", "Region", "Region", "Province", …
$ code_local <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ code_hasc  <chr> "VN.KT", "VN.DO", "VN.DC", "VN.GL", "VN.BP", "VN.TN", …
$ note       <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ hasc_maybe <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ region     <chr> "Nam Trung Bộ", "Tây Nguyên", "Tây Nguyên", "Nam Trung…
$ region_cod <chr> "VNM-KTM", "VNM-DLA", "VNM-DLA", "VNM-GLA", "VNM-SBE",…
$ provnum_ne <int> 19, 0, 22, 23, 20, 21, 31, 13, 14, 6, 57, 58, 55, 54, …
$ gadm_level <int> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, …
$ check_me   <int> 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20…
$ datarank   <int> 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, …
$ abbrev     <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ postal     <chr> NA, NA, NA, NA, "BP", "TN", "LA", "DT", "AG", "KG", "D…
$ area_sqkm  <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
$ sameascity <int> -99, -99, -99, -99, -99, -99, -99, -99, -99, -99, -99,…
$ labelrank  <int> 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, …
$ name_len   <int> 7, 8, 7, 7, 10, 8, 7, 9, 8, 10, 10, 6, 9, 7, 7, 10, 9,…
$ mapcolor9  <int> 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, …
$ mapcolor13 <int> 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, …
$ fips       <chr> "VM55", "VM91", "VM88", "VM49", "VM76", "VM33", "VM24"…
$ fips_alt   <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ woe_id     <int> 20070076, 28301719, 2347720, 2347733, 20070086, 234771…
$ woe_label  <chr> "Kon Tum, VN, Vietnam", "Dac Nong, VN, Vietnam", "Dak …
$ woe_name   <chr> "Kon Tum", "Dac Nong", "Dak Lak", "Gia Lai", "Bình Phư…
$ latitude   <dbl> 14.74510, 12.14250, 12.76910, 13.84930, 11.68050, 11.4…
$ longitude  <dbl> 107.969, 107.660, 108.133, 108.156, 106.897, 106.140, …
$ sov_a3     <chr> "VNM", "VNM", "VNM", "VNM", "VNM", "VNM", "VNM", "VNM"…
$ adm0_a3    <chr> "VNM", "VNM", "VNM", "VNM", "VNM", "VNM", "VNM", "VNM"…
$ adm0_label <int> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, …
$ admin      <chr> "Vietnam", "Vietnam", "Vietnam", "Vietnam", "Vietnam",…
$ geonunit   <chr> "Vietnam", "Vietnam", "Vietnam", "Vietnam", "Vietnam",…
$ gu_a3      <chr> "VNM", "VNM", "VNM", "VNM", "VNM", "VNM", "VNM", "VNM"…
$ gn_id      <int> 1565088, 1904987, 1584169, 1581088, 1905480, 1566557, …
$ gn_name    <chr> "Tinh Kon Tum", "Dak Nong", "Tinh Dak Lak", "Tinh Gia …
$ gns_id     <int> -3731073, 11412978, -3711947, -3715035, 409916, -37296…
$ gns_name   <chr> "Kon Tum, Tinh", "¿ak Nong, Tinh", "Dak Lak, Tinh", "…
$ gn_level   <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
$ gn_region  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ gn_a1_code <chr> "VN.55", "VN.91", "VN.88", "VN.49", "VN.76", "VN.33", …
$ region_sub <chr> NA, "Central Highlands", "Central Highlands", "South C…
$ sub_code   <chr> NA, NA, NA, "VM57", NA, "VM33", "VM24", "VM46", "VM43"…
$ gns_level  <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
$ gns_lang   <chr> "eng", "vie", "vie", "vie", "fas", "eng", "eng", "vie"…
$ gns_adm1   <chr> "VM55", "VM91", "VM88", "VM49", "VM76", "VM33", "VM24"…
$ gns_region <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ min_label  <dbl> 8.0, 8.0, 8.0, 8.0, 8.0, 8.7, 8.7, 8.7, 8.7, 8.0, 8.0,…
$ max_label  <dbl> 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11…
$ min_zoom   <dbl> 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, …
$ wikidataid <chr> "Q36315", "Q36723", "Q36690", "Q36662", "Q36672", "Q36…
$ name_ar    <chr> "محافظة كون توم", "محافظة داك نونغ", "محافظة داك لاك",…
$ name_bn    <chr> "কন্ তুম", "ডাক নোং", "ডাক লাক", "জিয়া লিয়া", "বিন পো", …
$ name_de    <chr> "Kon Tum", "Đắk Nông", "Đắk Lắk", "Gia Lai", "Bình Phư…
$ name_en    <chr> "Kon Tum", "Đắk Nông", "Đắk Lắk", "Gia Lai", "Bình Phư…
$ name_es    <chr> "Kon Tum", "Đăk Nông", "Đắk Lắk", "Gia Lai", "Bình Phư…
$ name_fr    <chr> "Kon Tum", "Đắk Nông", "Đắk Lắk", "Gia Lai", "Bình Phư…
$ name_el    <chr> "Κον Τουμ", "Ντακ Νονγκ", "Ντακ Λακ", "Γκία Λέι", "Μπι…
$ name_hi    <chr> "कॉन टम प्रांत", "डाक नोंग", "डाक लाक", "जिया लाई प्रांत", …
$ name_hu    <chr> "Kon Tum", "Đắk Nông", "Đắk Lắk", "Gia Lai", "Bình Phư…
$ name_id    <chr> "Kon Tum", "Dak Nong", "Dak Lak", "Gia Lai", "Binh Phu…
$ name_it    <chr> "Kon Tum", "Dak Nong", "Dak Lak", "Gia Lai", "Binh Phu…
$ name_ja    <chr> "コントゥム省", "ダクノン省", "ダクラク省", "ザライ省"…
$ name_ko    <chr> "꼰뚬성", "닥농성", "닥락성", "잘라이성", "빈프억성", …
$ name_nl    <chr> "Kon Tum", "Đắk Nông", "Đắk Lắk", "Gia Lai", "Bình Phư…
$ name_pl    <chr> "Prowincja Kon Tum", "Prowincja Đăk Nông", "Prowincja …
$ name_pt    <chr> "Kon Tum", "Dak Nong", "Dac Lac", "Gia Lai", "Binh Phu…
$ name_ru    <chr> "Контум", "Дакнонг", "Даклак", "Зялай", "Биньфыок", "Т…
$ name_sv    <chr> "Kon Tum", "Dak Nong", "Dak Lak", "Gia Lai", "Binh Phu…
$ name_tr    <chr> "Kon Tum", "Dak Nong", "Dak Lak", "Gia Lai", "Bình Phư…
$ name_vi    <chr> "Kon Tum", "Đắk Nông", "Đắk Lắk", "Gia Lai", "Bình Phư…
$ name_zh    <chr> "昆嵩省", "得农省", "多乐省", "嘉莱省", "平福省", "西…
$ ne_id      <dbl> 1159308305, 1159315895, 1159309225, 1159309227, 115930…
$ name_he    <chr> "קון טום", "דאק נאונגם", "דאקלאק", "יה לאי", "בין פייק…
$ name_uk    <chr> "Контум", "Дакнонг", "Даклак", "Зялай", "Біньфиок", "Т…
$ name_ur    <chr> "کون تم صوبہ", "داک نونگ صوبہ", "داک لاک صوبہ", "گیا ل…
$ name_fa    <chr> "استان کون توم", "استان داک نونگ", "استان داک لاک", "ا…
$ name_zht   <chr> "崑嵩省", "得農省", "多樂省", "嘉萊省", "平福省", "西…
$ FCLASS_ISO <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_US  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_FR  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_RU  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_ES  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_CN  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_TW  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_IN  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_NP  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_PK  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_DE  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_GB  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_BR  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_IL  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_PS  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_SA  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_EG  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_MA  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_PT  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_AR  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_JP  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_KO  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_VN  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_TR  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_ID  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_PL  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_GR  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_IT  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_NL  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_SE  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_BD  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_UA  <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ FCLASS_TLC <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
$ geometry   <MULTIPOLYGON [°]> MULTIPOLYGON (((107.4238 14..., MULTIPOLY…
ggplot() +   geom_sf(data = vietnam) +   theme_minimal()

world %>% arrange(region_wb) %>% pull(region_wb) %>% unique()
[1] "Antarctica"                 "East Asia & Pacific"       
[3] "Europe & Central Asia"      "Latin America & Caribbean" 
[5] "Middle East & North Africa" "North America"             
[7] "South Asia"                 "Sub-Saharan Africa"        
southasia <- world %>% filter(region_wb == "South Asia")
ggplot() +   geom_sf(data = southasia) +   theme_minimal()

southasia <- world %>% filter(region_wb == "Sub-Saharan Africa")
ggplot() +   geom_sf(data = southasia, aes(fill = admin)) +   theme(legend.position="none")

world %>% arrange(region_wb) %>% pull(region_un) %>% unique()
[1] "Antarctica"              "Seven seas (open ocean)"
[3] "Oceania"                 "Asia"                   
[5] "Europe"                  "Americas"               
[7] "Africa"                 
ggplot() +   geom_sf(data = world, aes(fill = admin)) +   theme(legend.position="none") +
  facet_wrap(.~region_wb)

library(readxl)
gini_vietnam <- read_excel('le/DataVN.xls')
glimpse(gini_vietnam)
Rows: 63
Columns: 16
$ id                       <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1…
$ province                 <chr> "Ha Noi", "Vinh Phuc", "Bac Ninh", "Quan…
$ `sub region`             <chr> "Red River Delta", "Red River Delta", "R…
$ gini                     <dbl> 0.33792, 0.28408, 0.28756, 0.26028, 0.29…
$ icgap                    <dbl> 6.321822, 4.780697, 4.984416, 4.298525, …
$ top20                    <dbl> 42.06828, 39.48452, 38.98663, 36.46464, …
$ `GDP 2021 (Billion VND)` <dbl> 1067540.0, 136183.0, 227614.6, 238186.3,…
$ `GDPPC (Thoudsand VND)`  <dbl> 128143.29, 114268.57, 155586.04, 176323.…
$ Investment               <dbl> 411261.000, 45796.747, 58219.000, 88728.…
$ emp                      <dbl> 46.09, 47.83, 51.02, 48.44, 48.02, 48.81…
$ lit                      <dbl> 98.94, 98.66, 98.35, 97.15, 98.73, 99.19…
$ edu                      <dbl> 23.9, 9.1, 9.7, 11.3, 8.0, 13.0, 7.5, 5.…
$ pop                      <dbl> 8330.83, 1191.78, 1462.95, 1350.85, 1936…
$ poprate                  <dbl> 1.02, 1.74, 3.04, 0.99, 1.04, 0.92, 1.21…
$ ubrate                   <dbl> 49.15915, 30.06679, 36.64855, 67.85950, …
$ `General average income` <dbl> 6002, 4511, 4917, 3992, 4304, 5093, 4192…
vietnam %>% arrange(name_alt) %>% distinct(name_alt)
gini_vietnam %>% arrange(province) %>% distinct()
vietnam %>% anti_join(gini_vietnam, by = c('name_alt' = 'province')) %>% arrange(name_alt) %>% distinct(name_alt)
gini_vietnam %>% drop_na(gini) %>% anti_join(vietnam, by = c('province'= 'name_alt')) %>% arrange(province) %>% distinct(province)
vietnam_gini <- vietnam %>% left_join(gini_vietnam, by = c("name_alt" = "province"))
library(sf)
jpn <- st_read(system.file("extdata", "jpn.geojson", package = "sf"))
LS0tCnRpdGxlOiAiTWFwcyBUZXN0IgphdXRob3I6ICJIaXJvc2hpIFN1enVraSIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCi0tLQoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHNmKQpsaWJyYXJ5KHJuYXR1cmFsZWFydGgpCmxpYnJhcnkocm5hdHVyYWxlYXJ0aGRhdGEpCmBgYAoKIyBgZ2VvbV9tYXBgCgpgYGAKbWFwX2RhdGEobWFwLCByZWdpb24gPSAiLiIsIGV4YWN0ID0gRkFMU0UsIC4uLikKYGBgCgpgYGB7cn0KbWFwX2RhdGEoJ3dvcmxkJykgJT4lIGFzX3RpYmJsZSgpCmBgYAoKYGBge3J9CndvcmxkMCA8LSBtYXBfZGF0YSgnd29ybGQnKQp3b3JsZDAgJT4lCiAgZ2dwbG90KCkgKwogIGdlb21fbWFwKGFlcyhsb25nLCBsYXQsIG1hcF9pZCA9IHJlZ2lvbiksIG1hcCA9IHdvcmxkMCwgZmlsbCA9ICJncmF5IiwgY29sID0gImJsYWNrIiwgc2l6ZSA9IDAuMSkgCmBgYAoKYGBge3J9CmxpYnJhcnkobWFwcykKaXNvLmV4cGFuZCgiSlAiKQppc28zMTY2CmBgYAoKYGBge3J9CmxpYnJhcnkoV0RJKQp3ZGlfY2FjaGUgPC0gV0RJY2FjaGUoKQp3ZGlfY2FjaGUKYGBgCgpgYGB7cn0Kd29ybGQwIDwtIG1hcF9kYXRhKCd3b3JsZCcpCndkaV9pbmNvbWUgPC0gd2RpX2NhY2hlJGNvdW50cnkgJT4lIHNlbGVjdChpc28yYywgaW5jb21lKQp3b3JsZF9pbmNvbWUgPC0gd29ybGQwICU+JSBtdXRhdGUoaXNvMmMgPSBpc28uYWxwaGEocmVnaW9uLCBuPTIpKSAlPiUKICBsZWZ0X2pvaW4od2RpX2luY29tZSwgYnkgPSAiaXNvMmMiKSAKd29ybGRfaW5jb21lCmBgYAoKYGBge3J9CndvcmxkX2luY29tZSAlPiUgCiAgbXV0YXRlKGluY29tZV9sZXZlbCA9IGZhY3RvcihpbmNvbWUsIGxldmVscyA9IGMoIkhpZ2ggaW5jb21lIiwgIlVwcGVyIG1pZGRsZSBpbmNvbWUiLCAiTG93ZXIgbWlkZGxlIGluY29tZSIsICJMb3cgaW5jb21lIiwgIk5vdCBjbGFzc2lmaWVkIiwgTkEpKSkgJT4lCiAgZ2dwbG90KCkgKwogIGdlb21fbWFwKGFlcyhsb25nLCBsYXQsIG1hcF9pZCA9IHJlZ2lvbiwgZmlsbCA9IGluY29tZV9sZXZlbCksIG1hcCA9IHdvcmxkX2luY29tZSwgY29sID0gImJsYWNrIiwgc2l6ZSA9IDAuMSkgCmBgYAoKYGBge3J9CndvcmxkMCAlPiUgbGVmdF9qb2luKGlzbzMxNjYsIGJ5ID0gYygicmVnaW9uIiA9ICJtYXBuYW1lIikpIApgYGAKCmBgYHtyfQp3ZGlfY2FjaGUkY291bnRyeQpgYGAKCgpgYGB7cn0KZWFzdGFzaWEgPC0gbWFwX2RhdGEoJ3dvcmxkJywgcmVnaW9uID0gYygiSmFwYW4iLCAiU291dGggS29yZWEiLCAiTm9ydGggS29yZWEiLCAiQ2hpbmEiLCAiTW9uZ29saWEiLCAiVGFpd2FuIikpICU+JQogIG11dGF0ZShpc28yYyA9IGlzby5hbHBoYShyZWdpb24sIG49MikpCmVhc3Rhc2lhICU+JQogIGdncGxvdCgpICsKICBnZW9tX21hcChhZXMobG9uZywgbGF0LCBtYXBfaWQgPSByZWdpb24pLCBtYXAgPSBlYXN0YXNpYSwgZmlsbCA9ICJncmF5IiwgY29sID0gImJsYWNrIiwgc2l6ZSA9IDAuMSkgCmBgYAoKYGBge3J9CmVhc3Rhc2lhIDwtIG1hcF9kYXRhKCd3b3JsZCcsIHJlZ2lvbiA9IGMoIkphcGFuIiwgIlNvdXRoIEtvcmVhIiwgIk5vcnRoIEtvcmVhIiwgIkNoaW5hIiwgIk1vbmdvbGlhIiwgIlRhaXdhbiIpKSAlPiUgbXV0YXRlKGlzbzJjID0gaXNvLmFscGhhKHJlZ2lvbiwgbj0yKSkKZWFzdGFzaWEgJT4lIGxlZnRfam9pbih3ZGlfaW5jb21lLCBieSA9ICJpc28yYyIpICU+JSAKICBtdXRhdGUoaW5jb21lX2xldmVsID0gZmFjdG9yKGluY29tZSwgbGV2ZWxzID0gYygiSGlnaCBpbmNvbWUiLCAiVXBwZXIgbWlkZGxlIGluY29tZSIsICJMb3dlciBtaWRkbGUgaW5jb21lIiwgIkxvdyBpbmNvbWUiLCAiTm90IGNsYXNzaWZpZWQiLCBOQSkpKSAlPiUKICBnZ3Bsb3QoKSArCiAgZ2VvbV9tYXAoYWVzKGxvbmcsIGxhdCwgbWFwX2lkID0gcmVnaW9uLCBmaWxsID0gaW5jb21lX2xldmVsKSwgbWFwID0gZWFzdGFzaWEsIGNvbCA9ICJibGFjayIsIHNpemUgPSAwLjEpIApgYGAKCmBgYHtyfQpjaGluYSA8LSBtYXBfZGF0YSgnd29ybGQnLCByZWdpb24gPSBjKCJDaGluYSIpKQpjaGluYSAlPiUKICBnZ3Bsb3QoKSArCiAgZ2VvbV9tYXAoYWVzKGxvbmcsIGxhdCwgbWFwX2lkID0gcmVnaW9uLCBmaWxsID0gc3VicmVnaW9uKSwgbWFwID0gY2hpbmEsIGNvbCA9ICJibGFjayIsIHNpemUgPSAwLjEpIApgYGAKCmBgYHtyfQplYSA8LSBtYXBfZGF0YSgnd29ybGQnLCByZWdpb24gPSBjKCJKYXBhbiIsICJTb3V0aCBLb3JlYSIsICJOb3J0aCBLb3JlYSIsICJDaGluYSIsICJNb25nb2xpYSIsICJUYWl3YW4iKSkKZWEgJT4lCiAgZ2dwbG90KCkgKwogIGdlb21fbWFwKGFlcyhsb25nLCBsYXQsIG1hcF9pZCA9IHJlZ2lvbiwgZmlsbCA9IHJlZ2lvbiksIG1hcCA9IGVhLCBjb2wgPSAiYmxhY2siLCBzaXplID0gMC4xKSArCiAgbGFicyh4ID0gIiIsIHkgPSAiIikgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiLCBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCksIGF4aXMudGlja3MueD1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpLCBheGlzLnRpY2tzLnk9ZWxlbWVudF9ibGFuaygpKQpgYGAKCmBgYHtyfQptYXBfZGF0YSgnd29ybGQnKSAlPiUgZ2dwbG90KGFlcyhsb25nLCBsYXQpKSArIGdlb21fcG9seWdvbihhZXMoZ3JvdXAgPSBncm91cCwgZmlsbCA9IHJlZ2lvbiksIGNvbCA9ICJibGFjayIsIGxpbmV3aWR0aCA9IDAuMSkgKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQpgYGAKCmBgYHtyfQptYXBfZGF0YSgnd29ybGQyJykgJT4lIGdncGxvdChhZXMobG9uZywgbGF0KSkgKyBnZW9tX3BvbHlnb24oYWVzKGdyb3VwID0gZ3JvdXAsIGZpbGwgPSByZWdpb24pLCBjb2wgPSAiYmxhY2siLCBsaW5ld2lkdGggPSAwLjEpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKYGBgCgpgYGB7cn0Kd29ybGQxIDwtIHNmOjpzdF9hc19zZihtYXAoJ3dvcmxkJywgcGxvdCA9IEZBTFNFLCBmaWxsID0gVFJVRSkpCmdncGxvdCgpICsgZ2VvbV9zZihkYXRhID0gd29ybGQxKQpgYGAKCgpgYGB7cn0Kd29ybGRfc2YgPC0gc2Y6OnN0X2FzX3NmKG1hcCgnd29ybGQnLCBwbG90ID0gRkFMU0UsIGZpbGwgPSBUUlVFKSkgJT4lIAogIG11dGF0ZShpc28yYyA9IGlzby5hbHBoYShJRCwgbj0yKSkgJT4lIAogIGxlZnRfam9pbih3ZGlfaW5jb21lLCBieSA9ICJpc28yYyIpIAp3b3JsZF9zZiAlPiUgYXNfdGliYmxlKCkKYGBgCgpgYGB7cn0Kd29ybGRfc2YgJT4lIAogIG11dGF0ZShpbmNvbWVfbGV2ZWwgPSBmYWN0b3IoaW5jb21lLCBsZXZlbHMgPSBjKCJIaWdoIGluY29tZSIsICJVcHBlciBtaWRkbGUgaW5jb21lIiwgIkxvd2VyIG1pZGRsZSBpbmNvbWUiLCAiTG93IGluY29tZSIsICJOb3QgY2xhc3NpZmllZCIsIE5BKSkpICU+JQogIGdncGxvdCgpICsKICBnZW9tX3NmKGFlcyhmaWxsID0gaW5jb21lX2xldmVsKSkgCmBgYAoKYGBge3J9CndvcmxkMiA8LSBzZjo6c3RfdHJhbnNmb3JtKAogIHdvcmxkMSwKICAiK3Byb2o9bGFlYSAreV8wPTAgK2xvbl8wPTE1NSArbGF0XzA9LTkwICtlbGxwcz1XR1M4NCArbm9fZGVmcyIKKQpnZ3Bsb3QoKSArIGdlb21fc2YoZGF0YSA9IHdvcmxkMikKYGBgCgojIyMgVm9sY2FubyBEYXRhCgpodHRwczovL2RhdGF2aXpweXIuY29tL2hvdy10by1tYWtlLXdvcmxkLW1hcC13aXRoLWdncGxvdDItaW4tci8KCmBgYHtyfQp2b2xjYW5vIDwtIHJlYWRyOjpyZWFkX2NzdigiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3Jmb3JkYXRhc2NpZW5jZS90aWR5dHVlc2RheS9tYXN0ZXIvZGF0YS8yMDIwLzIwMjAtMDUtMTIvdm9sY2Fuby5jc3YiKQp2b2xjYW5vCmBgYAoKYGBge3J9CmdncGxvdCgpICsKICBnZW9tX21hcCgKICAgIGRhdGEgPSB3b3JsZDAsIG1hcCA9IHdvcmxkMCwKICAgIGFlcyhsb25nLCBsYXQsIG1hcF9pZCA9IHJlZ2lvbiksCiAgICBjb2xvciA9ICJ3aGl0ZSIsIGZpbGwgPSAibGlnaHRncmF5Iiwgc2l6ZSA9IDAuMQogICkgKwogIGdlb21fcG9pbnQoCiAgICBkYXRhID0gdm9sY2FubywKICAgIGFlcyhsb25naXR1ZGUsIGxhdGl0dWRlLCBjb2xvciA9IHByaW1hcnlfdm9sY2Fub190eXBlKSwKICAgIGFscGhhID0gMC43CiAgKSAKYGBgCgoKIyMgYGFubm90YXRpb25fbWFwYAoKYGBge3J9CmRmIDwtIGRhdGEuZnJhbWUoCiAgbmFtZSA9IGMoIkNoYXJsb3R0ZSIsICJSYWxlaWdoIiwgIkdyZWVuc2Jvcm8iKSwKICBsYXQgPSBjKDM1LjIyNywgMzUuNzcyLCAzNi4wNzMpLAogIGxvbmcgPSBjKC04MC44NDMsIC03OC42MzksIC03OS43OTIpCikKCnAgPC0gZ2dwbG90KGRmLCBhZXMoeCA9IGxvbmcsIHkgPSBsYXQpKSArCiAgYW5ub3RhdGlvbl9tYXAoCiAgICBtYXBfZGF0YSgic3RhdGUiKSwKICAgIGZpbGwgPSAiYW50aXF1ZXdoaXRlIiwgY29sb3VyID0gImRhcmtncmV5IgogICkgKwogIGdlb21fcG9pbnQoY29sb3IgPSAiYmx1ZSIpICsKICBnZW9tX3RleHQoCiAgICBhZXMobGFiZWwgPSBuYW1lKSwKICAgIGhqdXN0ID0gMS4xMDUsIHZqdXN0ID0gMS4wNSwgY29sb3IgPSAiYmx1ZSIKICApCgpwICsgeGxpbSgtODQsIC03NikgKyB5bGltKDM0LCAzNy4yKQpgYGAKCmBgYHtyfQpwICsKICBjb29yZF9zZigKICAgIGNycyA9IHNmOjpzdF9jcnMoMzM0NyksCiAgICBkZWZhdWx0X2NycyA9IHNmOjpzdF9jcnMoNDMyNiksICAjIGRhdGEgaXMgcHJvdmlkZWQgYXMgbG9uZy1sYXQKICAgIHhsaW0gPSBjKC04NCwgLTc2KSwKICAgIHlsaW0gPSBjKDM0LCAzNy4yKQogICkKYGBgCgpgYGB7cn0KbmMgPC0gc2Y6OnN0X3JlYWQoc3lzdGVtLmZpbGUoInNoYXBlL25jLnNocCIsIHBhY2thZ2UgPSAic2YiKSwgcXVpZXQgPSBUUlVFKQpwICsKICBnZW9tX3NmKAogICAgZGF0YSA9IG5jLCBpbmhlcml0LmFlcyA9IEZBTFNFLAogICAgZmlsbCA9IE5BLCBjb2xvciA9ICJibGFjayIsIGxpbmV3aWR0aCA9IDAuMQogICkgKwogIGNvb3JkX3NmKGNycyA9IHNmOjpzdF9jcnMoMzM0NyksIGRlZmF1bHRfY3JzID0gc2Y6OnN0X2Nycyg0MzI2KSkKYGBgCgojIGBnZW9tX3NmYAoKU2VlIGFsc28sIGBjb29yZF9zZmAsIGBnZW9tX3NmX2xhYmVsYCwgYGdlb21fc2ZfdGV4dGAsIGBzdGF0X3NmYC4KCj4gVGhpcyBzZXQgb2YgZ2VvbSwgc3RhdCwgYW5kIGNvb3JkIGFyZSB1c2VkIHRvIHZpc3VhbGlzZSBzaW1wbGUgZmVhdHVyZSAoc2YpIG9iamVjdHMuIEZvciBzaW1wbGUgcGxvdHMsIHlvdSB3aWxsIG9ubHkgbmVlZCBnZW9tX3NmKCkgYXMgaXQgdXNlcyBzdGF0X3NmKCkgYW5kIGFkZHMgY29vcmRfc2YoKSBmb3IgeW91LiBnZW9tX3NmKCkgaXMgYW4gdW51c3VhbCBnZW9tIGJlY2F1c2UgaXQgd2lsbCBkcmF3IGRpZmZlcmVudCBnZW9tZXRyaWMgb2JqZWN0cyBkZXBlbmRpbmcgb24gd2hhdCBzaW1wbGUgZmVhdHVyZXMgYXJlIHByZXNlbnQgaW4gdGhlIGRhdGE6IHlvdSBjYW4gZ2V0IHBvaW50cywgbGluZXMsIG9yIHBvbHlnb25zLiBGb3IgdGV4dCBhbmQgbGFiZWxzLCB5b3UgY2FuIHVzZSBnZW9tX3NmX3RleHQoKSBhbmQgZ2VvbV9zZl9sYWJlbCgpLgoKYGBgCmdlb21fc2YoCiAgbWFwcGluZyA9IGFlcygpLAogIGRhdGEgPSBOVUxMLAogIHN0YXQgPSAic2YiLAogIHBvc2l0aW9uID0gImlkZW50aXR5IiwKICBuYS5ybSA9IEZBTFNFLAogIHNob3cubGVnZW5kID0gTkEsCiAgaW5oZXJpdC5hZXMgPSBUUlVFLAogIC4uLgopCmBgYAoKYGBge3J9CiMgbWFwX2RhdGEge2dncGxvdDJ9CiMgRWFzaWx5IHR1cm4gZGF0YSBmcm9tIHRoZSBtYXBzIHBhY2thZ2UgaW50byBhIGRhdGEgZnJhbWUgc3VpdGFibGUgZm9yIHBsb3R0aW5nIHdpdGggZ2dwbG90Mi4Kd29ybGRfbWFwIDwtIG1hcF9kYXRhKCJ3b3JsZCIpCmBgYAoKCmBgYHtyfQpsaWJyYXJ5KG1hcHMpCndvcmxkMSA8LSBzZjo6c3RfYXNfc2YobWFwKCd3b3JsZCcsIHBsb3QgPSBGQUxTRSwgZmlsbCA9IFRSVUUpKQpnZ3Bsb3QoKSArIGdlb21fc2YoZGF0YSA9IHdvcmxkMSkKYGBgCgpgYGB7cn0Kd29ybGRfbWFwIDwtIG1hcCgnd29ybGQnLCBwbG90ID0gRkFMU0UpCmdsaW1wc2Uod29ybGRfbWFwKQpgYGAKCiMgYGdlb21fcG9seWdvbmAKCmBgYHtyfQojIFdoZW4gdXNpbmcgZ2VvbV9wb2x5Z29uLCB5b3Ugd2lsbCB0eXBpY2FsbHkgbmVlZCB0d28gZGF0YSBmcmFtZXM6CiMgb25lIGNvbnRhaW5zIHRoZSBjb29yZGluYXRlcyBvZiBlYWNoIHBvbHlnb24gKHBvc2l0aW9ucyksICBhbmQgdGhlCiMgb3RoZXIgdGhlIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBwb2x5Z29uICh2YWx1ZXMpLiAgQW4gaWQKIyB2YXJpYWJsZSBsaW5rcyB0aGUgdHdvIHRvZ2V0aGVyCgppZHMgPC0gZmFjdG9yKGMoIjEuMSIsICIyLjEiLCAiMS4yIiwgIjIuMiIsICIxLjMiLCAiMi4zIikpCgp2YWx1ZXMgPC0gZGF0YS5mcmFtZSgKICBpZCA9IGlkcywKICB2YWx1ZSA9IGMoMywgMy4xLCAzLjEsIDMuMiwgMy4xNSwgMy41KQopCgpwb3NpdGlvbnMgPC0gZGF0YS5mcmFtZSgKICBpZCA9IHJlcChpZHMsIGVhY2ggPSA0KSwKICB4ID0gYygyLCAxLCAxLjEsIDIuMiwgMSwgMCwgMC4zLCAxLjEsIDIuMiwgMS4xLCAxLjIsIDIuNSwgMS4xLCAwLjMsCiAgMC41LCAxLjIsIDIuNSwgMS4yLCAxLjMsIDIuNywgMS4yLCAwLjUsIDAuNiwgMS4zKSwKICB5ID0gYygtMC41LCAwLCAxLCAwLjUsIDAsIDAuNSwgMS41LCAxLCAwLjUsIDEsIDIuMSwgMS43LCAxLCAxLjUsCiAgMi4yLCAyLjEsIDEuNywgMi4xLCAzLjIsIDIuOCwgMi4xLCAyLjIsIDMuMywgMy4yKQopCgojIEN1cnJlbnRseSB3ZSBuZWVkIHRvIG1hbnVhbGx5IG1lcmdlIHRoZSB0d28gdG9nZXRoZXIKZGF0YXBvbHkgPC0gbWVyZ2UodmFsdWVzLCBwb3NpdGlvbnMsIGJ5ID0gYygiaWQiKSkKCnAgPC0gZ2dwbG90KGRhdGFwb2x5LCBhZXMoeCA9IHgsIHkgPSB5KSkgKwogIGdlb21fcG9seWdvbihhZXMoZmlsbCA9IHZhbHVlLCBncm91cCA9IGlkKSkKcApgYGAKCmBgYHtyfQojIFdoaWNoIHNlZW1zIGxpa2UgYSBsb3Qgb2Ygd29yaywgYnV0IHRoZW4gaXQncyBlYXN5IHRvIGFkZCBvbgojIG90aGVyIGZlYXR1cmVzIGluIHRoaXMgY29vcmRpbmF0ZSBzeXN0ZW0sIGUuZy46CgpzZXQuc2VlZCgxKQpzdHJlYW0gPC0gZGF0YS5mcmFtZSgKICB4ID0gY3Vtc3VtKHJ1bmlmKDUwLCBtYXggPSAwLjEpKSwKICB5ID0gY3Vtc3VtKHJ1bmlmKDUwLG1heCA9IDAuMSkpCikKCnAgKyBnZW9tX2xpbmUoZGF0YSA9IHN0cmVhbSwgY29sb3VyID0gImdyZXkzMCIsIGxpbmV3aWR0aCA9IDUpCmBgYAoKYGBge3J9CiMgQW5kIGlmIHRoZSBwb3NpdGlvbnMgYXJlIGluIGxvbmdpdHVkZSBhbmQgbGF0aXR1ZGUsIHlvdSBjYW4gdXNlCiMgY29vcmRfbWFwIHRvIHByb2R1Y2UgZGlmZmVyZW50IG1hcCBwcm9qZWN0aW9ucy4KCiAgIyBBcyBvZiBSIHZlcnNpb24gMy42IGdlb21fcG9seWdvbigpIHN1cHBvcnRzIHBvbHlnb25zIHdpdGggaG9sZXMKICAjIFVzZSB0aGUgc3ViZ3JvdXAgYWVzdGhldGljIHRvIGRpZmZlcmVudGlhdGUgaG9sZXMgZnJvbSB0aGUgbWFpbiBwb2x5Z29uCgogIGhvbGVzIDwtIGRvLmNhbGwocmJpbmQsIGxhcHBseShzcGxpdChkYXRhcG9seSwgZGF0YXBvbHkkaWQpLCBmdW5jdGlvbihkZikgewogICAgZGYkeCA8LSBkZiR4ICsgMC41ICogKG1lYW4oZGYkeCkgLSBkZiR4KQogICAgZGYkeSA8LSBkZiR5ICsgMC41ICogKG1lYW4oZGYkeSkgLSBkZiR5KQogICAgZGYKICB9KSkKICBkYXRhcG9seSRzdWJpZCA8LSAxTAogIGhvbGVzJHN1YmlkIDwtIDJMCiAgZGF0YXBvbHkgPC0gcmJpbmQoZGF0YXBvbHksIGhvbGVzKQoKICBwIDwtIGdncGxvdChkYXRhcG9seSwgYWVzKHggPSB4LCB5ID0geSkpICsKICAgIGdlb21fcG9seWdvbihhZXMoZmlsbCA9IHZhbHVlLCBncm91cCA9IGlkLCBzdWJncm91cCA9IHN1YmlkKSkKICBwCmBgYAoKIyBOYXR1cmFsIEVhcnRoIERhdGEgCgpodHRwczovL3d3dy5uYXR1cmFsZWFydGhkYXRhLmNvbQoKR2V0IG5hdHVyYWwgZWFydGggd29ybGQgY291bnRyeSBwb2x5Z29ucwoKTWFudWFsOiBodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvcm5hdHVyYWxlYXJ0aC9ybmF0dXJhbGVhcnRoLnBkZgoKIyMgYG5lX2NvdW50cmllc2AKCmBgYApuZV9jb3VudHJpZXMoCiAgc2NhbGUgPSAxMTAsCiAgdHlwZSA9ICJjb3VudHJpZXMiLAogIGNvbnRpbmVudCA9IE5VTEwsCiAgY291bnRyeSA9IE5VTEwsCiAgZ2VvdW5pdCA9IE5VTEwsCiAgc292ZXJlaWdudHkgPSBOVUxMLAogIHJldHVybmNsYXNzID0gYygic3AiLCAic2YiKQopCmBgYAoKIyMjIEFyZ3VtZW50cwoKKiBzY2FsZTogc2NhbGUgb2YgbWFwIHRvIHJldHVybiwgb25lIG9mIDExMCwgNTAsIDEwIG9yICdzbWFsbCcsICdtZWRpdW0nLCAnbGFyZ2UnCiogdHlwZTogY291bnRyeSB0eXBlLCBvbmUgb2YgJ2NvdW50cmllcycsICdtYXBfdW5pdHMnLCAnc292ZXJlaWdudHknLCAndGlueV9jb3VudHJpZXMnCiogY29udGluZW50OiBhIGNoYXJhY3RlciB2ZWN0b3Igb2YgY29udGluZW50IG5hbWVzIHRvIGdldCBjb3VudHJpZXMgZnJvbS4KKiBjb3VudHJ5OiBhIGNoYXJhY3RlciB2ZWN0b3Igb2YgY291bnRyeSBuYW1lcy4KKiBnZW91bml0OiBhIGNoYXJhY3RlciB2ZWN0b3Igb2YgZ2VvdW5pdCBuYW1lcy4KKiBzb3ZlcmVpZ250eTogYSBjaGFyYWN0ZXIgdmVjdG9yIG9mIHNvdmVyZWlnbnR5IG5hbWVzLgoqIHJldHVybmNsYXNzOiAnc3AnIGRlZmF1bHQgb3IgJ3NmJyBmb3IgU2ltcGxlIEZlYXR1cmVzCgpgYGB7cn0KbmVfY291bnRyaWVzKHNjYWxlID0gImxhcmdlIiwgcmV0dXJuY2xhc3MgPSAic2YiKSAlPiUKICBnZ3Bsb3QoKSArICAgZ2VvbV9zZigpCmBgYAoKYGBge3J9Cm5lX2NvdW50cmllcyhzY2FsZSA9ICJzbWFsbCIsIHJldHVybmNsYXNzID0gInNmIikgJT4lCiAgZ2dwbG90KCkgKyAgIGdlb21fc2YoKQpgYGAKCmBgYHtyfQp3b3JsZCA8LSBuZV9jb3VudHJpZXMoc2NhbGUgPSAibWVkaXVtIiwgcmV0dXJuY2xhc3MgPSAic2YiKQpgYGAKCmBgYHtyfQpjbGFzcyh3b3JsZCkKYGBgCgpgYGB7cn0Kd29ybGQgJT4lIGFzX3RpYmJsZSgpCmBgYApgYGB7cn0Kd29ybGQgJT4lIGNvbG5hbWVzKCkKYGBgCgpgYGB7cn0Kd29ybGQgJT4lIGdncGxvdCgpICsgICBnZW9tX3NmKCkKYGBgCgpgYGB7cn0Kd29ybGQgJT4lIGdncGxvdCgpICsgICBnZW9tX3NmKGFlcyhmaWxsID0gaW5jb21lX2dycCkpCmBgYAoKYGBge3J9CndvcmxkICU+JSBmaWx0ZXIoc3VicmVnaW9uID09ICJTb3V0aC1FYXN0ZXJuIEFzaWEiKSAlPiUKICBnZ3Bsb3QoKSArICAgZ2VvbV9zZihhZXMoZmlsbCA9IGluY29tZV9ncnApKQpgYGAKCiMjIyBgdHlwZWAgYXJndW1lbnQKCmBgYHtyfQpuZV9jb3VudHJpZXModHlwZSA9ICJjb3VudHJpZXMiLCBjb3VudHJ5ID0gIkphcGFuIiwgc2NhbGUgPSAibWVkaXVtIiwgcmV0dXJuY2xhc3MgPSAic2YiKSAlPiUKICBnZ3Bsb3QoKSArIGdlb21fc2YoKQpgYGAKCmBgYHtyfQpuZV9jb3VudHJpZXModHlwZSA9ICJtYXBfdW5pdHMiLCBjb3VudHJ5ID0gIkphcGFuIiwgc2NhbGUgPSAibWVkaXVtIiwgcmV0dXJuY2xhc3MgPSAic2YiKSAlPiUKICBnZ3Bsb3QoKSArIGdlb21fc2YoKQpgYGAKCmBgYHtyfQpsaWJyYXJ5KHNwKQogIHNmX3dvcmxkIDwtIG5lX2NvdW50cmllcyhyZXR1cm5jbGFzcyA9ICJzZiIpCiAgcGxvdChzZl93b3JsZCkKc3BkZl90aW55X2NvdW50cmllcyA8LSBuZV9jb3VudHJpZXModHlwZSA9ICJ0aW55X2NvdW50cmllcyIsIHNjYWxlID0gNTApCiAgcGxvdChzcGRmX3RpbnlfY291bnRyaWVzKQpgYGAKCgojIyBgbmVfc3RhdGVzYAoKR2V0IG5hdHVyYWwgZWFydGggd29ybGQgc3RhdGUgKGFkbWluIGxldmVsIDEpIHBvbHlnb25zCgoqKkRlc2NyaXB0aW9uKio6IHJldHVybnMgc3RhdGUgcG9seWdvbnMgKGFkbWluaXN0cmF0aXZlIGxldmVsIDEpIGZvciBzcGVjaWZpZWQgY291bnRyaWVzCgojIyMgVXNhZ2UKCmBgYApuZV9zdGF0ZXMoCiAgY291bnRyeSA9IE5VTEwsCiAgZ2VvdW5pdCA9IE5VTEwsCiAgaXNvX2EyID0gTlVMTCwKICBzcGRmID0gTlVMTCwKICByZXR1cm5jbGFzcyA9IGMoInNwIiwgInNmIikKKQpgYGAKCiMjIyBBcmd1bWVudHMKCiogY291bnRyeTogYSBjaGFyYWN0ZXIgdmVjdG9yIG9mIGNvdW50cnkgbmFtZXMuCgoqIGdlb3VuaXQ6IGEgY2hhcmFjdGVyIHZlY3RvciBvZiBnZW91bml0IG5hbWVzLgoKKiBpc29fYTI6IGEgY2hhcmFjdGVyIHZlY3RvciBvZiBpc29fYTIgY291bnRyeSBjb2RlcwoKKiBzcGRmOiBhbiBvcHRpb25hbCBhbHRlcm5hdGl2ZSBzdGF0ZXMgbWFwCgoqIHJldHVybmNsYXNzOiAnc3AnIGRlZmF1bHQgb3IgJ3NmJyBmb3IgU2ltcGxlIEZlYXR1cmVzCgojIyMgVmFsdWUKCiogU3BhdGlhbFBvbHlnb25zIERhdGFGcmFtZSBvciBzZgoKYGBge3J9CndvcmxkX2FkbWluMSA8LSBuZV9zdGF0ZXMocmV0dXJuY2xhc3MgPSAic2YiKQpgYGAKCmBgYHtyfQpjbGFzcyh3b3JsZF9hZG1pbjEpCmBgYAoKYGBge3J9CndvcmxkX2FkbWluMSAlPiUgY29sbmFtZXMoKQpgYGAKCmBgYHtyfQp3b3JsZF9hZG1pbjEgfD4gYXNfdGliYmxlKCkKYGBgCgpgYGB7cn0Kd29ybGRfYWRtaW4xIHw+IGdsaW1wc2UoKQpgYGAKCmBgYHtyfQp3b3JsZF9hZG1pbjEgJT4lIGFzX3RpYmJsZSgpICU+JSAKICBmaWx0ZXIoaXNvX2EyICE9ICItMSIpICU+JSBhcnJhbmdlKGFkbWluKSAlPiUKICBkaXN0aW5jdChpc29fYTIsIGFkbWluKQpgYGAKCmBgYHtyfQp3b3JsZF9hZG1pbjEgJT4lIHB1bGwoRkNMQVNTX0pQKSAlPiUgdW5pcXVlKCkKYGBgCgpgYGB7cn0KamFwYW4gPC0gd29ybGRfYWRtaW4xW3dvcmxkX2FkbWluMSRhZG1pbiA9PSAiSmFwYW4iLF0KYGBgCgpgYGB7cn0KamFwYW4gfD4gYXNfdGliYmxlKCkKYGBgCgpgYGB7cn0KZ2dwbG90KCkgKyAgIGdlb21fc2YoZGF0YSA9IGphcGFuKSArICAgdGhlbWVfbWluaW1hbCgpCmBgYAoKYGBge3J9CmNvdW50cnkgPC0gIkphcGFuIgp3b3JsZF9hZG1pbjEgJT4lIGZpbHRlcihhZG1pbiA9PSBjb3VudHJ5KSAlPiUgCiAgZ2dwbG90KCkgKyBnZW9tX3NmKCkKYGBgCgpgYGB7cn0KaXNvMiA8LSAiSUQiCndvcmxkX2FkbWluMSAlPiUgZmlsdGVyKGlzb19hMiA9PSBpc28yKSAlPiUgCiAgZ2dwbG90KCkgKyAgIGdlb21fc2YoKQpgYGAKCmBgYHtyfQppc28ycyA8LSBjKCJJTiIsIlBLIiwiQkQiLCJMSyIpCndvcmxkX2FkbWluMSAlPiUgZmlsdGVyKGlzb19hMiAlaW4lIGlzbzJzKSAlPiUgCiAgZ2dwbG90KCkgKyAgIGdlb21fc2YoYWVzKGZpbGwgPSBhZG1pbikpCmBgYAoKYGBge3J9CnJlZ2lvbnMgPC0gYygiVG9ob2t1IikKd29ybGRfYWRtaW4xICU+JSBmaWx0ZXIocmVnaW9uICVpbiUgcmVnaW9ucykgJT4lIAogIGdncGxvdCgpICsgICBnZW9tX3NmKCkKYGBgCgpgYGB7cn0Kd29ybGRfYWRtaW4xICU+JSBmaWx0ZXIoaXNvX2EyID09ICJKUCIpICU+JQogIGdncGxvdCgpICsgICBnZW9tX3NmKGFlcyhmaWxsID0gcmVnaW9uKSkKYGBgCgpgYGB7cn0Kd29ybGRfYWRtaW4xICU+JSBmaWx0ZXIoaXNvX2EyID09ICJKUCIpICU+JQogIGdncGxvdCgpICsgICBnZW9tX3NmKGFlcyhmaWxsID0gbmFtZV9sb2NhbCkpCmBgYAoKYGBge3J9CndvcmxkX2FkbWluMSAlPiUgZmlsdGVyKGlzb19hMiA9PSAiSlAiKSAlPiUKICBnZ3Bsb3QoKSArICAgZ2VvbV9zZihhZXMoZmlsbCA9IG5hbWVfbG9jYWwpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpgYGAKCmBgYHtyfQp3b3JsZF9hZG1pbjEgJT4lIGFycmFuZ2UoYWRtaW4pICU+JSBwdWxsKGFkbWluKSAlPiUgdW5pcXVlKCkKYGBgCgoKIyMgYG5lX2Rvd25sb2FkYAoKZG93bmxvYWQgZGF0YSBmcm9tIE5hdHVyYWwgRWFydGggYW5kIChvcHRpb25hbGx5KSByZWFkIGludG8gUgoKYGBge3J9Cm5lX2Rvd25sb2FkKHNjYWxlID0gMTEwLCB0eXBlID0gImNvdW50cmllcyIsIHJldHVybmNsYXNzID0gInNmIikgJT4lCiAgZ2dwbG90KCkgKyBnZW9tX3NmKCkKYGBgCgpgYGB7cn0KIyBmb3IgcmFzdGVyLCBoZXJlIGFuIGV4YW1wbGUgd2l0aCBNYW51YWwgU2hhZGVkIFJlbGllZiAoTVNSKSBkb3dubG9hZCAmIGxvYWQKCnJzdCA8LSBuZV9kb3dubG9hZChzY2FsZSA9IDUwLCB0eXBlID0gIk1TUl81ME0iLCBjYXRlZ29yeSA9ICJyYXN0ZXIiKQoKIyBsb2FkIGFmdGVyIGhhdmluZyBkb3dubG9hZGVkCnJzdCA8LSBuZV9sb2FkKAogIHNjYWxlID0gNTAsIHR5cGUgPSAiTVNSXzUwTSIsIGNhdGVnb3J5ID0gInJhc3RlciIsIGRlc3RkaXIgPQogICAgZ2V0d2QoKQopCgojIHBsb3QKbGlicmFyeSh0ZXJyYSkKdGVycmE6OnBsb3QocnN0KQojIGVuZCBkb250cnVuCmBgYAoKIyBnZW9kYXRhCgpgYGB7cn0KbGlicmFyeShnZW9kYXRhKQp0b2t5b19wcmVmZWN0dXJlIDwtIGdhZG0oIkpQTiIsIGxldmVsID0gMiwgcGF0aCA9ICJUb2t5byIpCnRva3lvIDwtIHN0X2FzX3NmKHRva3lvX3ByZWZlY3R1cmUpCmBgYApgYGB7cn0KdG9reW8gJT4lIGFzX3RpYmJsZSgpCmBgYAoKYGBge3J9CnRva3lvICU+JSBjb2xuYW1lcygpCmBgYAoKYGBge3J9CnRva3lvICU+JSBmaWx0ZXIoTkFNRV8xID09ICJLYW5hZ2F3YSIpICU+JSAKICBnZ3Bsb3QoKSArIGdlb21fc2YoYWVzKGZpbGwgPSBOQU1FXzIpKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKYGBgCgojIE1pc2NlbGxhbmVvdXMKCgpgYGB7cn0KdmlldG5hbSA8LSB3b3JsZF9hZG1pbjEgJT4lIGZpbHRlcihhZG1pbiA9PSAiVmlldG5hbSIpCmBgYAoKYGBge3J9CmdsaW1wc2UodmlldG5hbSkKYGBgCgpgYGB7cn0KZ2dwbG90KCkgKyAgIGdlb21fc2YoZGF0YSA9IHZpZXRuYW0pICsgICB0aGVtZV9taW5pbWFsKCkKYGBgCgpgYGB7cn0Kd29ybGQgJT4lIGFycmFuZ2UocmVnaW9uX3diKSAlPiUgcHVsbChyZWdpb25fd2IpICU+JSB1bmlxdWUoKQpgYGAKCmBgYHtyfQpzb3V0aGFzaWEgPC0gd29ybGQgJT4lIGZpbHRlcihyZWdpb25fd2IgPT0gIlNvdXRoIEFzaWEiKQpnZ3Bsb3QoKSArICAgZ2VvbV9zZihkYXRhID0gc291dGhhc2lhKSArICAgdGhlbWVfbWluaW1hbCgpCmBgYAoKYGBge3J9CnNvdXRoYXNpYSA8LSB3b3JsZCAlPiUgZmlsdGVyKHJlZ2lvbl93YiA9PSAiU3ViLVNhaGFyYW4gQWZyaWNhIikKZ2dwbG90KCkgKyAgIGdlb21fc2YoZGF0YSA9IHNvdXRoYXNpYSwgYWVzKGZpbGwgPSBhZG1pbikpICsgICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQpgYGAKCgpgYGB7cn0Kd29ybGQgJT4lIGFycmFuZ2UocmVnaW9uX3diKSAlPiUgcHVsbChyZWdpb25fdW4pICU+JSB1bmlxdWUoKQpgYGAKCgpgYGB7cn0KZ2dwbG90KCkgKyAgIGdlb21fc2YoZGF0YSA9IHdvcmxkLCBhZXMoZmlsbCA9IGFkbWluKSkgKyAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBmYWNldF93cmFwKC5+cmVnaW9uX3diKQpgYGAKCmBgYHtyfQpsaWJyYXJ5KHJlYWR4bCkKZ2luaV92aWV0bmFtIDwtIHJlYWRfZXhjZWwoJ2xlL0RhdGFWTi54bHMnKQpgYGAKCmBgYHtyfQpnbGltcHNlKGdpbmlfdmlldG5hbSkKYGBgCgpgYGB7cn0KdmlldG5hbSAlPiUgYXJyYW5nZShuYW1lX2FsdCkgJT4lIGRpc3RpbmN0KG5hbWVfYWx0KQpgYGAKCmBgYHtyfQpnaW5pX3ZpZXRuYW0gJT4lIGFycmFuZ2UocHJvdmluY2UpICU+JSBkaXN0aW5jdCgpCmBgYAoKYGBge3J9CnZpZXRuYW0gJT4lIGFudGlfam9pbihnaW5pX3ZpZXRuYW0sIGJ5ID0gYygnbmFtZV9hbHQnID0gJ3Byb3ZpbmNlJykpICU+JSBhcnJhbmdlKG5hbWVfYWx0KSAlPiUgZGlzdGluY3QobmFtZV9hbHQpCmBgYAoKYGBge3J9CmdpbmlfdmlldG5hbSAlPiUgZHJvcF9uYShnaW5pKSAlPiUgYW50aV9qb2luKHZpZXRuYW0sIGJ5ID0gYygncHJvdmluY2UnPSAnbmFtZV9hbHQnKSkgJT4lIGFycmFuZ2UocHJvdmluY2UpICU+JSBkaXN0aW5jdChwcm92aW5jZSkKYGBgCgpgYGB7cn0KdmlldG5hbV9naW5pIDwtIHZpZXRuYW0gJT4lIGxlZnRfam9pbihnaW5pX3ZpZXRuYW0sIGJ5ID0gYygibmFtZV9hbHQiID0gInByb3ZpbmNlIikpCmBgYAoKCmBgYHtyfQpsaWJyYXJ5KHNmKQpqcG4gPC0gc3RfcmVhZChzeXN0ZW0uZmlsZSgiZXh0ZGF0YSIsICJqcG4uZ2VvanNvbiIsIHBhY2thZ2UgPSAic2YiKSkKYGBgCgo=